package 二分快速幂.超级次方;

/**
 * TODO
 *
 * @className: cjcf
 * @description: TODO
 * @author: 等什么柠檬君
 * @date: 2022-05-09 18:37
 **/
public class cjcf {
    public static void main(String[] args) {
        int[] b = {2,0,0};
        int a = 2147483647;
        System.out.println(superPow(a, b));
    }
    static int MOD = 1337;
    public static int superPow(int a, int[] b) {
        // a = 1进行特殊判断，不特殊判断也可以，但是浪费时间，因为1的不管多少次幂都是1
        if (a == 1) {
            return 1;
        }
        // 从后往前，依次按照公式计算
        int ans = 1;
        for (int i = b.length - 1; i >= 0; i--) {
            // myPow(a, b[i])为思路中的y，每次将y乘到ans上
            ans = (ans * myPow(a, b[i])) % MOD;
            // 将a每次变为10次幂，a就是思路中的x
            a = myPow(a, 10);
        }
        return ans;
    }

    // 求解a^b，注意取模
    // 快速幂做法
    private static int myPow(int a, int b) {
        int ans = 1;
        a %= MOD;
        while (b > 0) {
            if ((b & 0x1) == 1) {
                ans = ans * a % MOD;
            }
            a = a * a % MOD;
            b >>= 1;
        }
        return ans;
    }
}

//    public static int superPow(int a, int[] b) {
//        if(a == 1){
//            return 1;
//        }
//        int count = 1;
//        for(int i = b.length -1;i >= 0; --i){
//            count *= myPow(a, b[i]) % 1337;
//            a = myPow(a, 10) ;
//        }
//        return count;
//    }
//    public static int myPow(int a, int n){
//        int ans = 1;
//        a %= 1337;
//        for (int i = 0; i < n; i++) {
//            ans = (ans * a) % 1337;
//        }
//        return ans;
//
////        if(n == 0){
////            return 1;
////        }
////        if((n & 1) == 0){
////            return myPow(a * a % 1337, n/2) % 1337 ;
////        }
////        return a*myPow(a * a % 1337, n/2) % 1337;
//    }

